problem s vynimkou
Otázka od: p.sestak@corag.sk
15. 7. 2004 12:07
Mam problem so zachytavanim vynimiek.
v tejto metode za urcitych podmienok vyvolam vynimku EFOpenError:
constructor TLogFile.create( aFileName : String; _ReadOnly : boolean );
var TmpHeader : TLogHeader;
begin
inherited Create();
FName := aFileName;
HFile := OpenFile( PChar(aFileName), OFStruct, ff );
LastError := GetLastError();
ReadFile(HFile, TmpHeader, SizeOf(TLogHeader), NumRead, Nil);
if( TmpHeader.MagicNum <> MAGIC_NUM )
then
begin
...
raise EFOpenError.Create('Log file ' + aFileName + ' is corrupted');
end
else
begin
LogHeader^ := TmpHeader;
GetMem(Groups, LogHeader.SigGroupCount*SizeOf(TSigGroup));
FillChar(Groups^, LogHeader.SigGroupCount*SizeOf(TSigGroup), 0);
ReadFile(HFile, Groups^, LogHeader.SigGroupCount*SizeOf(TSigGroup),
NumRead, Nil);
IsOpen := true;
GetMem(IOBuffer, LogHeader.RecordSize);
end;
end;//constructor TLogFile.create( aFileName : String );
Problem je v tom, ze po vyvolani tejto vynimky mi to nevyskoci von z
konstruktora ako by som predpokladal,
pretoze tam nie je nikde ziadna kostrukcia except on EFOpenError do, ale
zahadne skoci na posledny riadok:
GetMem(IOBuffer, LogHeader.RecordSize);
a snazi sa alokovat pamat. Tu ale vznikne dalsia vynimka od systemu
'Invalid Pointer Operation'.
Takze tato mi zrusi moju vyvolanu vynimku a v kode ktory vola
inkriminovany kostruktor nezachytim
nic:
try
LogFile := TLogFile.Create( fneMonitoringFile.FileName , false );
except
on EFOpenError do
begin
ShowMessage('Unable to open log file: ' +
fneMonitoringFile.FileName);
end;
end;
Vie mi niekto poradit, preco beh programu nevyskoci priamo z konstruktoru
po volani raise EFOpenError.Create() ale
skusa este vykonat nejaky kod v tejto metode?
Pavol Sestak
ICQ: 20989081
Odpovedá: p.sestak@corag.sk
15. 7. 2004 13:59
Takze problem bol v tom, ze ako parameter do konstruktora vynimky
som daval parameter konstruktora TLogFile.create(aFileName,...).
Neviem sice preco to tu zblbne, pretoze tento parameter je alokovany
predsa o uroven vyssie ale EFOpenError si s nim jednoducho nevie poradit
a nasledne vznika vynimka "Invalid Pointer Operation" a cely handling v
konstruktore
si zacne robit co chce.
Pavol Sestak
ICQ: 20989081